std::string str = "abc";
①str = str + "dd";
②str = "dd" + str;
これらの記述は有効のようです。
①の右辺はstr.operator+("dd");
と解釈でき理解できます。

②の右辺は "dd".operator+(str);
と書きかえるとこれは無効に見えます。

std::stringのoperator+のプロトタイプを調べたところテンプレートが駆使されており私では読めませんでした。

②が有効なのは、テンプレートの仕組み?でそう書けるようにつくられているからですか。