This one doesn't result in a compiler error, but a runtime error. Instead of measuring a wrong time, you get an exception which may be acceptable too. 
Any constructor you want to guard needs a default argument on which set(guard) is called.
struct Guard {
  Guard()
    :guardflagp()
  { }
  ~Guard() {
    assert(guardflagp && "Forgot to call guard?");
    *guardflagp = 0;
  }
  void *set(Guard const *&guardflag) {
    if(guardflagp) {
      *guardflagp = 0;
    }
    guardflagp = &guardflag;
    *guardflagp = this;
  }
private:
  Guard const **guardflagp;
};
class Foo {
public:
  Foo(const char *arg1, Guard &&g = Guard()) 
    :guard()
  { g.set(guard); }
  ~Foo() {
    assert(!guard && "A Foo object cannot be temporary!");
  }
private:
  mutable Guard const *guard;
}; 
The characteristics are:
Foo f() {
  // OK (no temporary)
  Foo f1("hello");
  // may throw (may introduce a temporary on behalf of the compiler)
  Foo f2 = "hello";
  // may throw (introduces a temporary that may be optimized away
  Foo f3 = Foo("hello");
  // OK (no temporary)
  Foo f4{"hello"};
  // OK (no temporary)
  Foo f = { "hello" };
  // always throws
  Foo("hello");
  // OK (normal copy)
  return f;
  // may throw (may introduce a temporary on behalf of the compiler)
  return "hello";
  // OK (initialized temporary lives longer than its initializers)
  return { "hello" };
}
int main() {
  // OK (it's f that created the temporary in its body)
  f();
  // OK (normal copy)
  Foo g1(f());
  // OK (normal copy)
  Foo g2 = f();
}
The case of f2, f3 and the return of "hello" may not be wanted. To prevent throwing, you can allow the source of a copy to be a temporary, by resetting the guard to now guard us instead of the source of the copy. Now you also see why we used the pointers above - it allows us to be flexible. 
class Foo {
public:
  Foo(const char *arg1, Guard &&g = Guard()) 
    :guard()
  { g.set(guard); }
  Foo(Foo &&other)
    :guard(other.guard)
  {
    if(guard) {
      guard->set(guard);
    }
  }
  Foo(const Foo& other)
    :guard(other.guard)
  {
    if(guard) {
      guard->set(guard);
    }
  }
  ~Foo() {
    assert(!guard && "A Foo object cannot be temporary!");
  }
private:
  mutable Guard const *guard;
}; 
The characteristics for f2, f3 and for return "hello" are now always // OK.